/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.manager.criar;

import br.com.foxinline.modelo.*;
import br.com.foxinline.servico.*;
import br.com.foxinline.utilitario.Msg;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.event.map.MarkerDragEvent;
import org.primefaces.event.map.PointSelectEvent;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.Marker;
import org.primefaces.model.map.Polygon;

/**
 *
 * @author ely
 */
@ViewScoped
@ManagedBean
public class ManagerCriarBairro implements Serializable {

    @EJB
    BairroServico bairroService;
    @EJB
    CidadeServico cityService;
    private Bairro bairro;
    private Cidade cidade;
    private DefaultMapModel mapModel;
    private List<Coordenada> coordenadas;
    private Coordenada coordenada;
    private String convZona;
    private Polygon polygon;
    private LatLng coord = null;

    @PostConstruct
    public void init() {
        bairro = new Bairro();
        cidade = new Cidade();
        coordenada = new Coordenada();
        coordenadas = new ArrayList<Coordenada>();
        mapModel = new DefaultMapModel();
        polygon = new Polygon();
    }

    public void handlePointClick(PointSelectEvent event) {

        LatLng latLng = event.getLatLng();

        addOverlayToMapModel(new Marker(latLng));

        mapModel.addOverlay(polygon);

        for (Marker premarker : mapModel.getMarkers()) {
            premarker.setDraggable(true);
        }
    }

    private void addOverlayToMapModel(Marker marker) {
        mapModel.addOverlay(marker);
        polygon.getPaths().add(marker.getLatlng());
        polygon.setStrokeColor("#FF9900");
        polygon.setFillColor("#FF9900");
        polygon.setFillOpacity(0.2);
    }

    public void onMarkerDrag(MarkerDragEvent event) {
        Marker marker = event.getMarker();

        for (Marker marker1 : mapModel.getMarkers()) {
            if (marker.getId().equals(marker1.getId())) {
                marker1.setLatlng(marker.getLatlng());
                break;
            }
        }

        polygon = new Polygon();

        List<Marker> markers = mapModel.getMarkers();
        mapModel = new DefaultMapModel();

        for (Marker m : markers) {
            addOverlayToMapModel(m);
        }
        mapModel.addOverlay(polygon);

        for (Marker premarker : mapModel.getMarkers()) {
            premarker.setDraggable(true);
        }
    }

    public void salvar() {
        try {

            for (Marker marker : mapModel.getMarkers()) {
                coordenada = new Coordenada();
                coordenada.setLat(marker.getLatlng().getLat());
                coordenada.setLng(marker.getLatlng().getLng());
                coordenadas.add(coordenada);
            }

            List<Bairro> bairros = bairroService.findByName(bairro.getNome(), cidade);
            if (bairros != null && !bairros.isEmpty()) {
                Msg.messagemError("Existe Bairro cadastrado com esse nome");
                return;
            }
            bairro.setCidade(cidade);
            bairroService.salvar(bairro);
            init();
            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception erro) {
            erro.printStackTrace();
        }
    }
    
    public void removerMarkers(){
        mapModel = new DefaultMapModel();
        coordenadas = new ArrayList<Coordenada>();
    }

    public List<Cidade> autocompleteCity(String query) {
        return cityService.autocomplete(query);
    }

    public Bairro getBairro() {
        return bairro;
    }

    public void setBairro(Bairro bairro) {
        this.bairro = bairro;
    }

    public Cidade getCidade() {
        return cidade;
    }

    public void setCidade(Cidade cidade) {
        this.cidade = cidade;
    }

    public DefaultMapModel getMapModel() {
        return mapModel;
    }

    public void setMapModel(DefaultMapModel mapModel) {
        this.mapModel = mapModel;
    }
}
